<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文用户手册: 从崩溃中恢复</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/usr_11.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>usr_11</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="usr_11.txt">usr_11.txt</a> </b>    适用于 Vim 9.0 版本。   最近更新: 2020年1月

                     <code class="vim">VIM 用户手册 - by Bram Moolenaar</code>
                                <code class="vim">译者</code>: Nek_in

                              从崩溃中恢复


你的计算机崩溃过吗？是不是还正好在你编辑了几个小时以后？不要惊慌！Vim 已经保存
了大部分的信息使你可以恢复你的大多数数据。本章告诉你怎样恢复这些数据并向你介绍
Vim 是如何处理交换文件的。

 <a href="usr_11.html#11.1">11.1</a>   基本恢复
 <a href="usr_11.html#11.2">11.2</a>   交换文件在哪
 <a href="usr_11.html#11.3">11.3</a>   是不是崩溃了？
 <a href="usr_11.html#11.4">11.4</a>   深入阅读

        下一章:  <a href="usr_12.html#usr_12.txt">usr_12.txt</a>   小窍门
        前一章:  <a href="usr_10.html#usr_10.txt">usr_10.txt</a>   做大修改
          目录:  <a href="usr_toc.html#usr_toc.txt">usr_toc.txt</a> 

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="11.1">11.1</a> </b>  基本恢复</h4>
在大多数情况下，恢复一个文件相当简单。假设你知道正在编辑的是哪个文件 (并且硬盘
没坏的话)。可以用 "-r" 选项启动 Vim:

<code class="example">        vim -r help.txt</code>
<code class="example"></code>
Vim 会读取交换文件 (用于保存你的编辑数据的文件) 并且提取原文的编辑碎片。如果
Vim 恢复了你的改变，你会看到如下文字 (当然了，文件名会不一样):

<code class="section">        Using swap file ".help.txt.swp" </code>
<code class="section">        Original file "~/vim/runtime/doc/help.txt" </code>
<code class="section">        Recovery completed. You should check if everything is OK. </code>
<code class="section">        (You might want to write out this file under another name </code>
<code class="section">        and run diff with the original file to check for changes) </code>
<code class="section">        You may want to delete the .swp file now. </code>

        (<code class="vim">译者注</code>: 中文情况下是:
<code class="section">        使用交换文件 ".help.txt.swp"</code>
<code class="section">        原文件 "~/vim/runtime/doc/help.txt"</code>
<code class="section">        恢复完成。请确定一切正常。 </code>
<code class="section">        (你可能想要把这个文件另存为别的文件名，</code>
<code class="section">        再执行 diff 与原文件比较以检查是否有改变)</code>
<code class="section">        现在可以删除 .swp 文件。</code>
        )

为了安全起见，可以用另一个文件名保存这个文件:

<code class="example">        :write help.txt.recovered</code>
<code class="example"></code>
可以把这个文件与原文件作一下比较，看看恢复的效果如何。这方面 Vimdiff 可以帮很
大的忙 (参见  <a href="usr_08.html#08.7">08.7</a> )。例如: 
<code class="example"></code>
<code class="example">        :write help.txt.recovered</code>
<code class="example">        :edit #</code>
<code class="example">        :diffsp help.txt</code>
<code class="example"></code>
<code class="note">注意</code>用一个比较新的原文件来比较 (你在计算机崩溃前最后保存过的文件)，并且检查有
没有东西丢失了 (由于某些问题导致 Vim 无法恢复)。
    如果在恢复的过程中 Vim 显示出一些<code class="note">警告</code>信息，<code class="note">注意</code>小心阅读。这应该是很少见
的。

如果恢复产生的文件和文件内容完全一致，你会看到以下消息:

<code class="section">        Using swap file ".help.txt.swp" </code>
<code class="section">        Original file "~/vim/runtime/doc/help.txt" </code>
<code class="section">        Recovery completed. Buffer contents equals file contents. </code>
<code class="section">        You may want to delete the .swp file now. </code>

通常这是因为你已经恢复过改变，或者修改后写入了文件。此时删除交换文件应该安全。

最后所做的一些修改不能恢复是正常的。Vim 在你停止大约 4 秒不输入的时候或者输入
大约两百个字符以后才会更新交换文件。这间可以通过 <a href="options.html#'updatetime'">'updatetime'</a> 和 <a href="options.html#'updatecount'">'updatecount'</a>
两个选项来调整。这样，如果系统崩溃前 Vim 没有更新交换文件，最后一次更新后编辑
的内容就会丢失。

如果你编辑的时候没有给定文件名，可以用一个空的字符串来表示文件名:

<code class="example">        vim -r ""</code>
<code class="example"></code>
你需要进入原来的目录执行这个命令，否则 Vim 是找不到这个交换文件的。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="11.2">11.2</a> </b>  交换文件在哪</h4>
Vim 可以把交换文件保存在几个不同的地方。通常是原文件所在的目录。要知道这一点，
进入该目录，然后输入:

<code class="example">        vim -r</code>
<code class="example"></code>
Vim 会列出所有它能找到的交换文件。它还会从其它目录寻找本目录文件的交换文件，但
它不会寻找其它目录里的交换文件，更不会遍及整个目录树。
    这个命令的输出如下:

<code class="section">        Swap files found: </code>
<code class="section">           In current directory: </code>
<code class="section">        1.    .main.c.swp </code>
<code class="section">                  owned by: mool   dated: Tue May 29 21:00:25 2001 </code>
<code class="section">                 file name: ~mool/vim/vim6/src/main.c </code>
<code class="section">                  modified: YES </code>
<code class="section">                 user name: mool   host name: masaka.moolenaar.net </code>
<code class="section">                process ID: 12525 </code>
<code class="section">           In directory ~/tmp: </code>
<code class="section">              -- none -- </code>
<code class="section">           In directory /var/tmp: </code>
<code class="section">              -- none -- </code>
<code class="section">           In directory /tmp: </code>
<code class="section">              -- none -- </code>

        (<code class="vim">译者</code>: 中文的情形如下:
<code class="section">        找到以下交换文件:</code>
<code class="section">           位于当前目录:</code>
<code class="section">        1.    .main.c.swp </code>
<code class="section">                    所有者: mool    日期: Tue May 29 21:00:25 2001 </code>
<code class="section">                    文件名: ~mool/vim/vim6/src/main.c </code>
<code class="section">                    修改过: 是 </code>
<code class="section">                    用户名: mool     主机名: masaka.moolenaar.net </code>
<code class="section">                   进程 ID: 12525 </code>
<code class="section">           位于目录 ~/tmp:</code>
<code class="section">                -- 无 --</code>
<code class="section">           位于目录 /var/tmp:</code>
<code class="section">                -- 无 --</code>
<code class="section">           位于目录 /tmp:</code>
<code class="section">                -- 无 --</code>
        )

如果有几个交换文件，其中一个可能是你要的，Vim 会给出一个文件列表，你需要输入一
个表示这个文件的数字。小心检查那几个文件的时间，并确定哪一个才是你需要的。
  万一你不知道是哪个的话，一个一个试一试。


使 用 指 定 的 交 换 文 件

如果你知道要用哪个文件，你可以指定交换文件的名字。Vim 会找出交换文件所对应的原
始文件的名字。

例如: 
<code class="example">        Vim -r .help.txt.swo</code>
<code class="example"></code>
这个方法在交换文件在一个非预期的目录中时很有用。Vim 知道 *.s[uvw][a-z] 模式的
文件是交换文件。

如果这还不行，看看 Vim 报告的文件名是什么，然后根据需要给文件换名。根据
<a href="options.html#'directory'">'directory'</a> 选项的值你可以知道 Vim 会把交换文件放到什么地方。

        <code class="note">备注</code>:
        Vim 在 <a href="options.html#'dir'">'dir'</a> 选项指定的目录中寻找名为 "filename.sw?" 的交换文件。如果
        通配符不能正常工作 (例如 <a href="options.html#'shell'">'shell'</a> 选项不正确)，Vim 转而尝试文件
        "filename.swp"。如果仍失败，你就只能通过给定交换文件的名称来恢复原来的
        文件了。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="11.3">11.3</a> </b>  是不是崩溃了？                           <b class="vimtag"> <a name="ATTENTION">ATTENTION</a> </b>    <b class="vimtag"> <a name="E325">E325</a> </b></h4>
Vim 尽可能保护你不要做傻事。有时你打开一个文件，天真地以为文件的内容会显示出
来。可是，Vim 却给出一段很长的信息:

<code class="section">                E325: ATTENTION </code>
<code class="section">        Found a swap file by the name ".main.c.swp" </code>
<code class="section">                  owned by: mool   dated: Tue May 29 21:09:28 2001 </code>
<code class="section">                 file name: ~mool/vim/vim6/src/main.c </code>
<code class="section">                  modified: no </code>
<code class="section">                 user name: mool   host name: masaka.moolenaar.net </code>
<code class="section">                process ID: 12559 (still running) </code>
<code class="section">        While opening file "main.c" </code>
<code class="section">                     dated: Tue May 29 19:46:12 2001 </code>
<code class="section"> </code>
<code class="section">        (1) Another program may be editing the same file. </code>
<code class="section">            If this is the case, be careful not to end up with two </code>
<code class="section">            different instances of the same file when making changes. </code>
<code class="section">            Quit, or continue with caution. </code>
<code class="section"> </code>
<code class="section">        (2) An edit session for this file crashed. </code>
<code class="section">            If this is the case, use ":recover" or "vim -r main.c" </code>
<code class="section">            to recover the changes (see ":help recovery"). </code>
<code class="section">            If you did this already, delete the swap file ".main.c.swp" </code>
<code class="section">            to avoid this message. </code>

        (<code class="vim">译者注</code>: 翻译成中文如下:

<code class="section">                E325: <code class="note">注意</code></code>
<code class="section">         发现交换文件 "main.c.swp" </code>
<code class="section">             所有者: mool     日期: 2001年5月29日 星期二 21:09:28</code>
<code class="section">             文件名: ~mool/vim/vim6/src/main.c</code>
<code class="section">             修改过: 否</code>
<code class="section">             用户名: mool   主机名: masaka.moolenaar.net</code>
<code class="section">             进程号: 12559 (仍在运行) </code>
<code class="section">         正在打开文件 "main.c" </code>
<code class="section">               日期: 2001年5月29日 星期二 19:46:12</code>
<code class="section"></code>
<code class="section">        (1) 另一个程序可能也在编辑同一个文件。</code>
<code class="section">            如果是这种情况，修改时请<code class="note">注意</code>避免同一个文件产生两个不同的版本。 </code>
<code class="section">            </code>
<code class="section">            退出，或小心地继续。</code>
<code class="section"></code>
<code class="section">        (2) 上次编辑此文件时崩溃。</code>
<code class="section">            如果是这样，请用 ":recover" 或 "vim -r main.c" </code>
<code class="section">            恢复修改的内容 (请见 ":help recovery")。</code>
<code class="section">            如果你已经进行了恢复，请删除交换文件 ".main.c.swp" </code>
<code class="section">            以避免再看到此消息。</code>

        )

你遇到这个信息是因为 Vim 发现你编辑的文件的交换文件已经存在。这一定是有什么地
方出问题了。可能的原因有两个:

1. 这个文件正在被另一个进程编辑。<code class="note">注意</code>有 "process ID" 那行。它看起来是这样的:

<code class="section">                process ID: 12559 (still running) </code>

    "still running" 表示同一台计算机上有一个进程正在编辑这个文件。在非 Unix 的
    系统上你不会得到这个信息。而如果你通过网络编辑这个文件，可能也得不到这个信
    息，因为那个进程不在你的机器上。在这两种情况下，你要自己找到原因。
       如果另一个 Vim 正在编辑这个文件，继续编辑会导致同一个文件有两个版本。最
    后存盘的文件会覆盖前一个版本。这样的结果是一些编辑数据丢失了。这种情况下，
    你最好退出这个 Vim。

2. 交换文件可能是由于前一次 Vim 或者计算机崩溃导致的。检查提示信息中的日期。如
   果交换文件比你正在编辑的文件新，而且出现这个信息:

<code class="section">                modified: YES </code>

   这就表明你很可能需要恢复了。
       如果文件的日期比交换文件新，可能是在崩溃后被修改过了 (也许你已经恢复
   过，只是没有删除交换文件？)，也可能文件在崩溃前保存过，但这发生在在最后一次
   写入该交换文件之后 (那你运气了，你根本不需要这个旧的交换文件)。Vim 会用如下
   语句提醒你:

<code class="section">      NEWER than swap file! </code>

      (<code class="vim">译者注</code>: 意为 "文件比交换文件新")


<code class="note">备注</code> 在下面情形下，Vim 知道交换文件没有用了，会自动删除它:
- 文件是合法的交换文件 (魔术数正确)。
- 文件修改过的标志位未置位。
- 进程不在运行。

可以用  <a href="autocmd.html#FileChangedShell">FileChangedShell</a>  自动命令事件来编程处理这种情况。

<code class="section">无 法 读 取 的 交 换 文 件</code>

有时下面这样的信息

<code class="section">        [cannot be read] </code>

<code class="section">        或 <code class="special">[无法读取]</code> (中文信息，<code class="vim">译者</code>)</code>

会出现在交换文件的文件名之下。这可好可坏，依情况而定。

如果上次编辑在作出任何修改前就崩溃了的话，是好事。这样交换文件的长度为 0。你只
要删除之然后继续即可。

如果情况是你对交换文件没有读权限，就比较糟糕。你可能得以只读方式浏览该文件。或
者退出。在多用户系统中，如果你以别人的身份登录并做了上一次修改，先退出登录然后
以那个身份重新登录可能会 "治愈" 该读取错误。不然的话，你得找出是谁做的上一次修
改 (或正在修改)，然后和那个人聊聊。

如果情况是交换文件所在的磁盘物理性地损坏了，就非常糟糕了。幸运的是，这种情况几
乎不会发生。
你可能需要以只读方式查看文件 (如果允许的话)，看看到底有多少改动被 "忘记" 了。
如果你是改动文件的那个人，准备好重做你的改动。


怎 么 办 ？                                     <b class="vimtag"> <a name="swap-exists-choices">swap-exists-choices</a> </b>

如果 Vim 版本支持对话框，你可以从对话框的六个选择中挑一个:

<code class="section">  Swap file ".main.c.swp" already exists! </code>
<code class="section">  <code class="special">[O]</code>pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it: </code>

  (<code class="vim">译者</code>: 含义是:
<code class="section">  交换文件 ".main.c.swp" 已经存在！</code>
<code class="section">  以只读方式打开([O])，直接编辑((E))，恢复((R))，退出((Q))，中止((A))，删除 </code>
<code class="section">交换文件((D)): </code>
  )

O  用只读方式打开文件。当你只是想看看文件的内容，而不打算恢复它的时候用这个选
   项。你可能知道有人在编辑它，但你想看看它的内容，而不会修改它。

E  直接编辑。小心使用这个选择！如果这个文件已经被另一个文件打开，你编辑它会导
   致它有两个版本。Vim 已经<code class="note">警告</code>过你了，安全比事后说对不起要好。

R  从交换文件中恢复文件。如果你知道交换文件中有新的东西，而你想恢复它，选择这
   一项。

Q  退出。不再编辑该文件。在有另一个 Vim 编辑该文件的时候选这一项。
       如果你刚打开 Vim，这会退出 Vim。当你用多个窗口打开几个文件，Vim 只会在
   第一个文件遇到交换文件的时候退出。如果你是通过编辑命令打开文件，该文件不会
   被载入，Vim 会回到原来的文件中。

A  中止。类似 (Q) 退出，但同时中止更多的命令。这在试图加载一个编辑多个文件的脚
   本 (例如一个多窗口的会话) 时很有用。

D  删除交换文件。当你能确定你不再需要它的时候选这一项。例如，它不包括修改的数
   据，或者你的文件比交换文件新。
       在 Unix 系统上，只有建立这个交换文件的进程不再运行，这个选择才会出现。

如果没有出现对话框 (你使用的 Vim 不支持对话框)，你只能手工处理。要恢复一个文
件，使用如下命令:

<code class="example">        :recover</code>
<code class="example"></code>
Vim 不是总能检测到一个文件有交换文件的。当另一个会话把交换文件放到别的位置或者
在编辑另一台机器的文件的时候，双方使用的交换文件路径不一样都会发生这个问题。所
以，不要老是等 Vim 来提醒你。

如果你确实不想看到这个信息，你可以在 <a href="options.html#'shortmess'">'shortmess'</a> 选项中加上 'A' 标志位。不过一
般你不需要这样做。

关于加密和交换文件关系的注释，见  <a href="recover.html#:recover-crypt">:recover-crypt</a> 。
要通过程序访问交换文件，见  <a href="builtin.html#swapinfo()">swapinfo()</a> 。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="11.4">11.4</a> </b>  深入阅读</h4>
 <a href="recover.html#swap-file">swap-file</a>      解释交换文件在什么地方创建以及名字是什么。
 <a href="recover.html#:preserve">:preserve</a>      手工刷新交换文件
 <a href="recover.html#:swapname">:swapname</a>      查看当前文件的交换文件
<a href="options.html#'updatecount'">'updatecount'</a>   多少个键被敲下后执行一次交换文件刷新
<a href="options.html#'updatetime'">'updatetime'</a>    交换文件刷新后的超时时间
<a href="options.html#'swapsync'">'swapsync'</a>      交换文件刷新后是否执行磁盘同步
<a href="options.html#'directory'">'directory'</a>     列出用于保存交换文件的目录
<a href="options.html#'maxmem'">'maxmem'</a>        写入交换文件前的内存使用限制
<a href="options.html#'maxmemtot'">'maxmemtot'</a>     同上，当用于所有文件

</section><hr class="doubleline" /><section class=inner>
<h4></h4>下一章:  <a href="usr_12.html#usr_12.txt">usr_12.txt</a>   小窍门

版权: 参见  <a href="usr_01.html#manual-copyright">manual-copyright</a>   vim:tw=78:ts=8:noet:ft=help:norl:
</section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
